HBase (一) 简介

背景

HBase是Apache顶级项目Hadoop的子项目。与传统的RDBMS关系型数据库(Oracle, MySQL, DB2, Hive)等不同,HBase属于NoSQL数据库。 Hbase是对于谷歌提出的BigTable的开源实现。

定义

BigTable里的定义:BigTable is a sparse, distributed, persistent mulitdimensional sorted map, indexed by a row key, column key, and a timestamp.
具体了解下这些定义,就可以了解HBase独特的数据模型。

  • map 键值对
  • sparse 稀疏
  • distributed 分布式
  • persistent 持久化
  • multidimensional 多维度
  • sorted 排序
  • index by a row key, column key, a timestamp 索引

HBase的数据模型

HBase里面的结构层级主要有:
Namespace -> Table -> Row -> Column Family -> Column Qualifier -> Cell
Namespace:
Hbase默认有两张表:hbase, default。 hbase存储系统配置。所有不指定Namespace的表格都存储在default下。 当然可以自己创建Namespace, 并建立其下对应的表格。

Table:
一样的概念, 只不过table创建的时候只需要指定Column Family(列簇)

Column Family:
列簇, 列的最小存储单元

Column Qualifier:
列簇的列,每一行的列不需要一致

Cell:
由row key, column family, column Qualifier唯一索引的一个值,Cell拥有版本号,默认采用的是插入的时间戳。

  • 用惯用的数据库表格表示下:


    image.png
  • 更直观的键值对表示法:


    image.png

特点

其实从以上定义里已经可以发现HBase的特点了,归纳一下

  1. 大,表存储不设限制,支持上亿行, 上百万列
  2. 列簇的概念,拥有面向列的存储和控制
  3. 稀疏,列簇中的列可以拥有不同的列,稀疏化的存储结社空间
  4. 版本控制, 默认插入时的时间戳为cell的版本
  5. 数据统一为不解析的byte数组,没有类型的概念。 包括存储的键和值都是byte
  6. 方便扩展,只需要扩展对应的regionserver就可以。关系型的数据库的扩展取决于server的上限,除非分库分表。

选择

什么时候适合?

  1. 当行级别达到一个亿或者十亿级别的时候,适合采用HBase做分布式存储。 其QPS查询性能非常高。
  2. 确定项目不需要考虑RDBMS提供的有用的特性(二级索引,类型化的列, 高级查询)的时候,可以采用。

部署运行参考官网

shell 操作

启动shell界面

bin/hbase shell

help可以查看支持的命令。 下面列举几个常用的命令:

  1. 查看数据表
    list
  2. 创建数据表
hbase(main):004:0> create 'test2', 'test_cf'
0 row(s) in 2.7530 seconds

=> Hbase::Table - test2
  1. 插入数据
hbase(main):006:0> put 'test2','row1','test_cf:cq1','value1'
0 row(s) in 1.9330 seconds
hbase(main):008:0> scan 'test2'
ROW                                    COLUMN+CELL                                                                                                   
 row1                                  column=test_cf:cq1, timestamp=1521603395109, value=value1                                                     
1 row(s) in 0.0400 seconds

hbase(main):009:0> get 'test2', 'row1'
COLUMN                                 CELL                                                                                                          
 test_cf:cq1                           timestamp=1521603395109, value=value1                                                                         
1 row(s) in 0.1450 seconds

  1. 获取表数据
    get
  2. 全表扫描
    scan
scan 'hbase:meta'
scan 'hbase:meta',{COLUMNS => 'info:regioninfo'}
scan 'ns1:t1',{COLUMNS=>['c1','c2'],LIMIT=>10,STARTROW=>'xyz'}
scan 't1',{COLUMNS=>'c1',TIMERANGE=>[1303668804,1303668904]}
scan 't1',{REVERSED=>true}
scan 't1',{
    ROWPREFIXFILTER=>'row2',
    FILTER=>"(QualifierFilter(>=,'binary:xyz')) 
    AND (TimestampsFilter(123,456))"}
scan 't1',{FILTER => org.apache.hadoop.hbase.filter.ColumnPaginationFilter.new(1,0)}
scan 't1',{CONSISTENCY=>'TIMELINE'}

设置操作属性:
scan 't1',{COLUMNS => ['c1','c2'],ATTRIBUTES=>{'mykey'=>'myvalue'}}
scan 't1',{COLUMNS=>['c1','c2'],AUTHORIZATIONS=>['PRIVATE','SECRET']}
有个额外的选项:CACHE_BLOCKS,默认为true
还有个选项:RAW,返回所有cells(包括删除的markers和uncollected deleted cells,不能用来选择特定的columns,默认为default)
如:scan 't1',{RAW=>true,VERSIONS=>10}
  1. 删除数据表
    disable 'test' #先要disable才能drop
    drop 'test'
  2. 查看namespace
hbase(main):003:0> list_namespace
NAMESPACE                                                                                                                                            
default                                                                                                                                              
hbase                                                                                                                                                
2 row(s) in 0.3480 seconds

案例学习

参考来自文章
假设社交网站有一个user表,包含user_id, user_name。 需要设计一个关注的功能。
该功能有以下几点操作

  • 读操作
  1. user 关注了哪些人
  2. 给定的user A 是否关注user B
  3. 哪些人在关注user A
  • 写操作
  1. 用户关注了一个用户
  2. 用户取消对一个用户的关注

传统的关系型数据库的设计一般如下:
设计一张user_follow表. (id, follower_id, folloee_id)。 一旦发生操作,更新或读取user_follower表,此表能满足所有场景。

那如果切换成HBase的思维呢? (此处例子不一定是最适合HBase的,只是用来查看设计思维)

设计一:
设计一个表user_follow, 简单点一个列簇(column family) follow。
使用userid作为row key , 使用什么作为列名呢? 假设直接使用被跟随者作为列名。格式如下:


image.png

此处的列中存储的cell值没有特别用途,直接存个1.
这个方案能适配读操作中的1,2, 却没法快速的查询3. 改进设计如设计二

设计二:

  1. 再建立一张新表,保存与设计一关系相反的数据, 即被跟随者作为row key, 保存跟随了他的用户。
  2. 在设计一的基础上再加一个对应的行,用 跟随者 + 被跟随者的名字作为row key.
    这就是一个意识的改变,row key的存储是任意的,无类型的,可以做很多非结构的设计。 但是一般会存储row key的hash值,方便统一长度和计算性能。

经验法则(rules of thumb)

  • 表设计
  1. region最好大小为10-50G
  2. cf大概一张表1-3个为好,不要用HBASE mimic 模仿关系型数据库
  3. 一个有1或者2个cf的表最好的region值为50-100, Remember that a region is a contiguous segment of a column family
  4. cf名字越短越好
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容

  • 入门指南 1. 简介 Quickstart会让你启动和运行一个单节点单机HBase。 2. 快速启动 – 单点HB...
    和心数据阅读 4,323评论 1 41
  • HBase是运行在Hadoop集群上的一个数据库,与传统的数据库有严格的ACID(原子性、一致性、隔离性、持久性)...
    陌上疏影凉阅读 2,359评论 0 7
  • 1. HBase介绍,Hbase是什么? HBase -- Hadoop Database ,是一个高可靠、高性能...
    奉先阅读 3,686评论 1 36
  • Hbase概述 Hbase是一个开源可伸缩的针对海量数据存储的分布式nosql数据库。Hbase可以看成是以行键(...
    shuaidong阅读 1,005评论 0 1
  • HBase那些事 @(大数据工程学院)[HBase, Hadoop, 优化, HadoopChen, hbase]...
    分痴阅读 3,880评论 3 17